package com.summer.util;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 用于简化RedisTemplate的操作
 */
@Component
public class RedisUtil {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 将 key，value 存放到redis数据库中
     *
     * @param key
     * @param value
     */
    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(value));
    }

    /**
     * 将 key，value 存放到redis数据库中，设置过期时间单位是秒
     *
     * @param key
     * @param value
     * @param expireTime
     */
    public void set(String key, Object value, long expireTime) {
        redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(value), expireTime, TimeUnit.SECONDS);
    }

    /**
     * 判断 key 是否在 redis 数据库中
     *
     * @param key
     * @return
     */
    public boolean exists(final String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 获取与 key 对应的对象
     *
     * @param key
     * @param clazz 目标对象类型
     * @param <T>
     * @return
     */
    public <T> T get(String key, Class<T> clazz) {
        String s = get(key);
        if (s == null) {
            return null;
        }
        return JSONUtil.toBean(s, clazz);
    }

    /**
     * 获取与 key 对应的HashSet,返回HashSet
     *
     * @param key
     * @param clazz HashSet元素类型
     * @param <T>
     * @return
     */
    public <T> HashSet<T> getHashSet(String key, Class<T> clazz) {
        String s = get(key);
        if (s == null) {
            return null;
        }
        JSONArray jsonArray = JSONUtil.parseArray(s);
        List<T> list = JSONUtil.toList(jsonArray, clazz);
        if (list==null){
            return null;
        }
        HashSet<T> set=new HashSet<T>();
        for (T t : list) {
            set.add(t);
        }
        return set;
    }

    /**
     * 获取 key 对应的字符串
     *
     * @param key
     * @return
     */
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 删除 key 对应的 value
     *
     * @param key
     */
    public void delete(String key) {
        redisTemplate.delete(key);
    }

    /**
     * 模糊匹配获取key
     * @param key
     * @return
     */
    public Set<String> keys(String key){
        return redisTemplate.keys(key);
    }

    public void deleteKey(String key){
        Set<String> keys = keys(key);
        redisTemplate.delete(keys);
    }
}
